[iOS 7] SpriteKitの物理エンジンを使ってみた -超入門-
iOS 7のSpriteKitには物理エンジンが搭載されているようです。
今回は、ちょっとだけそれを使ってみます。
実装
タップしたポイントに赤い四角を表示させ、そのまま重力で落下するサンプルを作ってみます。
#import "CMMyScene.h" @implementation CMMyScene -(id)initWithSize:(CGSize)size { if (self = [super initWithSize:size]) { // ここに初期処理 } return self; } -(void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event { CGPoint location = [touches.anyObject locationInNode:self]; [self addRedSquare:location]; } - (void)addRedSquare:(CGPoint)location { SKSpriteNode *redSquare = [SKSpriteNode spriteNodeWithColor:[SKColor redColor] size:CGSizeMake(100.0f, 100.0f)]; redSquare.position = location; redSquare.physicsBody = [SKPhysicsBody bodyWithRectangleOfSize:redSquare.size]; [self addChild:redSquare]; } @end
はい、簡単でした。
ノードを生成して、physicsBodyに物理エンジンで計算する物体を指定するだけです。
動作確認
では、動かしてみます。
上の画像では分かりにくいですが、タップしたポイントに赤い四角が表示され落下していきます。
しかし、たくさんタップしていくと、フレームレートがどんどん低下していき動きがカクカクしてきます。
これは、赤い四角が画面外に落ちていった後もシーン上には存在していて物理シミュレートされており、
数が増えればその分処理も重くなっていくというわけです。
では、直していきます。
修正
#import "CMMyScene.h"
@implementation CMMyScene
-(id)initWithSize:(CGSize)size { if (self = [super initWithSize:size]) { // ここに初期処理 } return self; }
-(void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event { CGPoint location = [touches.anyObject locationInNode:self]; [self addRedSquare:location]; }
- (void)addRedSquare:(CGPoint)location { SKSpriteNode *redSquare = [SKSpriteNode spriteNodeWithColor:[SKColor redColor] size:CGSizeMake(100.0f, 100.0f)]; redSquare.position = location; redSquare.physicsBody = [SKPhysicsBody bodyWithRectangleOfSize:redSquare.size]; redSquare.name = @"redSquare"; [self addChild:redSquare]; }
-(void)didSimulatePhysics { [self enumerateChildNodesWithName:@"redSquare" usingBlock:^(SKNode *node, BOOL *stop) { if (node.position.y < 0) [node removeFromParent]; }]; } @end [/c]
didSimulatePhysicsメソッドを実装することで、
フレームごとの物理シミュレート処理が行われた後に任意の処理をを差し込むことができます。
今回は、赤い四角が画面の下に落下した後に親のシーンから削除しています。これで、フレームレートが低下しなくなります。
簡単ですが、はじめの一歩なので今回はここまで。続きはまた今度。
ではでは。